2  Intro a analizar Base de Datos, y gráficos

Author

Brayan Cubides

2.1 Cargando los Paquetes

Se inicia el análisis instalando (si es necesario) y cargando todas las librerías que se utilizarán a lo largo del documento.

library(readxl) 
library(psych) 
library(tidyverse)
library(epiDisplay)
library(ggplot2)
library(ggrepel)
library(qcc)
library(fBasics)
library(RcmdrMisc)
library(aplpack)

2.2 Lectura de Base de Datos

Se establece el directorio de trabajo y se leen los datos desde un archivo de Excel. Nota: Para una mejor portabilidad del código, se recomienda el uso de Proyectos de RStudio, que establecen el directorio de trabajo automáticamente en la carpeta del proyecto.

Escuelas <- read_excel("Datos_informe.xlsx")

2.3 Exploración del Set de Datos

Se realiza una revisión inicial del conjunto de datos para entender su estructura, dimensiones y el tipo de cada variable.

# View(Escuelas) # Para ver la base de datos, no ejecutar si es muy grande
head(Escuelas, 10) # Muestra las primeras 10 filas
# A tibble: 10 × 13
   Escuela                Cod Pais  Insc_t_completo Alumnos_facultad Costo_local
   <chr>                <dbl> <chr>           <dbl>            <dbl>       <dbl>
 1 Melbourne Business …  2345 Aust…             200                5       24420
 2 University of South…  2347 Aust…             228                4       19993
 3 Indian University o…  2349 India             392                5        4300
 4 Chinese University …  2351 China              90                5       11140
 5 International Unive…  2353 Japon             126                4       33060
 6 Asian Institute of …  2355 Fili…             389                5        7562
 7 Indian Institute of…  2357 India             380                5        3935
 8 National University…  2359 Sing…             147                6        6146
 9 Indian Institute of…  2361 India             463                8        2880
10 Australian National…  2363 Aust…              42                2       20300
# ℹ 7 more variables: Costo_extranjero <dbl>, Edad <dbl>, Porc_extranj <dbl>,
#   GMAT <chr>, Ex_Ingles <chr>, Experiencia <dbl>, Sueldo_inicial <dbl>
tail(Escuelas, 10) # Muestra las ultimas 10 filas
# A tibble: 10 × 13
   Escuela                Cod Pais  Insc_t_completo Alumnos_facultad Costo_local
   <chr>                <dbl> <chr>           <dbl>            <dbl>       <dbl>
 1 Monash Mt Eliza Bus…  2375 Aust…             350               13       16200
 2 Asian Institute of …  2377 Tail…             300               10       18200
 3 University of Adela…  2379 Aust…              20               19       16426
 4 Massey University     2381 Nuev…              30               15       13106
 5 Royal Melbourne Ins…  2383 Aust…              30                7       13880
 6 Jamnalal Bajaj Inst…  2385 India             240                9        1000
 7 Curlin Institute of…  2387 Aust…              98               15        9475
 8 Lahore University o…  2389 Paki…              70               14       11250
 9 Universiti Sains Ma…  2391 Mala…              30                5        2260
10 De La Salle Univers…  2393 Mala…              44               17        3300
# ℹ 7 more variables: Costo_extranjero <dbl>, Edad <dbl>, Porc_extranj <dbl>,
#   GMAT <chr>, Ex_Ingles <chr>, Experiencia <dbl>, Sueldo_inicial <dbl>
# Usando el pipe (%>%) para encadenar operaciones
Escuelas %>% head(10)
# A tibble: 10 × 13
   Escuela                Cod Pais  Insc_t_completo Alumnos_facultad Costo_local
   <chr>                <dbl> <chr>           <dbl>            <dbl>       <dbl>
 1 Melbourne Business …  2345 Aust…             200                5       24420
 2 University of South…  2347 Aust…             228                4       19993
 3 Indian University o…  2349 India             392                5        4300
 4 Chinese University …  2351 China              90                5       11140
 5 International Unive…  2353 Japon             126                4       33060
 6 Asian Institute of …  2355 Fili…             389                5        7562
 7 Indian Institute of…  2357 India             380                5        3935
 8 National University…  2359 Sing…             147                6        6146
 9 Indian Institute of…  2361 India             463                8        2880
10 Australian National…  2363 Aust…              42                2       20300
# ℹ 7 more variables: Costo_extranjero <dbl>, Edad <dbl>, Porc_extranj <dbl>,
#   GMAT <chr>, Ex_Ingles <chr>, Experiencia <dbl>, Sueldo_inicial <dbl>
Escuelas %>% tail(5) %>% summary()
   Escuela               Cod           Pais           Insc_t_completo
 Length:5           Min.   :2385   Length:5           Min.   : 30.0  
 Class :character   1st Qu.:2387   Class :character   1st Qu.: 44.0  
 Mode  :character   Median :2389   Mode  :character   Median : 70.0  
                    Mean   :2389                      Mean   : 96.4  
                    3rd Qu.:2391                      3rd Qu.: 98.0  
                    Max.   :2393                      Max.   :240.0  
 Alumnos_facultad  Costo_local    Costo_extranjero      Edad     
 Min.   : 5       Min.   : 1000   Min.   : 1000    Min.   :23.0  
 1st Qu.: 9       1st Qu.: 2260   1st Qu.: 2260    1st Qu.:24.0  
 Median :14       Median : 3300   Median : 3600    Median :28.0  
 Mean   :12       Mean   : 5457   Mean   :10451    Mean   :27.2  
 3rd Qu.:15       3rd Qu.: 9475   3rd Qu.:19097    3rd Qu.:29.0  
 Max.   :17       Max.   :11250   Max.   :26300    Max.   :32.0  
  Porc_extranj      GMAT            Ex_Ingles          Experiencia 
 Min.   : 0.0   Length:5           Length:5           Min.   :0.0  
 1st Qu.: 2.5   Class :character   Class :character   1st Qu.:1.0  
 Median : 3.5   Mode  :character   Mode  :character   Median :1.0  
 Mean   :12.8                                         Mean   :0.8  
 3rd Qu.:15.0                                         3rd Qu.:1.0  
 Max.   :43.0                                         Max.   :1.0  
 Sueldo_inicial 
 Min.   : 7000  
 1st Qu.: 7500  
 Median :13100  
 Mean   :19720  
 3rd Qu.:16000  
 Max.   :55000  

2.3.1 Tipos de variables y conversión

Se verifica la estructura y se convierten las columnas al tipo de dato apropiado (en este caso, a factor para las variables categóricas).

Escuelas %>% str() # Da el resumen de la tabla
tibble [25 × 13] (S3: tbl_df/tbl/data.frame)
 $ Escuela         : chr [1:25] "Melbourne Business School" "University of South Wales" "Indian University of Management" "Chinese University of Hong Kong" ...
 $ Cod             : num [1:25] 2345 2347 2349 2351 2353 ...
 $ Pais            : chr [1:25] "Australia" "Australia" "India" "China" ...
 $ Insc_t_completo : num [1:25] 200 228 392 90 126 389 380 147 463 42 ...
 $ Alumnos_facultad: num [1:25] 5 4 5 5 4 5 5 6 8 2 ...
 $ Costo_local     : num [1:25] 24420 19993 4300 11140 33060 ...
 $ Costo_extranjero: num [1:25] 29600 32582 4300 11140 33060 ...
 $ Edad            : num [1:25] 28 29 22 29 28 25 23 29 23 30 ...
 $ Porc_extranj    : num [1:25] 47 28 0 10 60 50 1 51 0 80 ...
 $ GMAT            : chr [1:25] "Si" "Si" "No" "Si" ...
 $ Ex_Ingles       : chr [1:25] "No" "No" "No" "No" ...
 $ Experiencia     : num [1:25] 1 1 0 0 0 1 0 1 0 1 ...
 $ Sueldo_inicial  : num [1:25] 71400 65200 7100 31000 87000 22800 7500 43300 7400 46600 ...
Escuelas %>% dim() # Dimensión de la tabla
[1] 25 13
Escuelas %>% colnames() # Muestra el Nombre de las columnas
 [1] "Escuela"          "Cod"              "Pais"             "Insc_t_completo" 
 [5] "Alumnos_facultad" "Costo_local"      "Costo_extranjero" "Edad"            
 [9] "Porc_extranj"     "GMAT"             "Ex_Ingles"        "Experiencia"     
[13] "Sueldo_inicial"  
# Conversión de columnas a tipo factor
Escuelas[,c(1,2,3,10,11,12)] <- lapply(Escuelas[,c(1,2,3,10,11,12)], as.factor)

# Se recodifican los niveles de la variable 'Experiencia'
levels(Escuelas$Experiencia) <- c("No","Si")

# Se consultan las categorías únicas de la variable 'Pais'
Escuelas %>% distinct(Pais)
# A tibble: 10 × 1
   Pais         
   <fct>        
 1 Australia    
 2 India        
 3 China        
 4 Japon        
 5 Filipinas    
 6 Singapur     
 7 Tailandia    
 8 Nueva Zelanda
 9 Pakistán     
10 Malasia      

2.4 1. Análisis de Variables Cualitativas

2.4.1 1.1 Tablas de Frecuencia

Se generan tablas para resumir las frecuencias absolutas y relativas de las variables categóricas.

Escuelas %>% count(Pais) # Muestra las frecuencias absolutas
# A tibble: 10 × 2
   Pais              n
   <fct>         <int>
 1 Australia         9
 2 China             2
 3 Filipinas         1
 4 India             4
 5 Japon             1
 6 Malasia           2
 7 Nueva Zelanda     1
 8 Pakistán          1
 9 Singapur          2
10 Tailandia         2
table(Escuelas$Pais) # Da la tabla de frecuencias sencilla

    Australia         China     Filipinas         India         Japon 
            9             2             1             4             1 
      Malasia Nueva Zelanda      Pakistán      Singapur     Tailandia 
            2             1             1             2             2 
# Tabla de frecuencias completa con porcentajes y acumulados
tab1(Escuelas$Pais, graph=FALSE)
Escuelas$Pais : 
              Frequency Percent Cum. percent
Australia             9      36           36
China                 2       8           44
Filipinas             1       4           48
India                 4      16           64
Japon                 1       4           68
Malasia               2       8           76
Nueva Zelanda         1       4           80
Pakistán              1       4           84
Singapur              2       8           92
Tailandia             2       8          100
  Total              25     100          100

2.4.2 1.2 Gráficos

Se utilizan diferentes tipos de gráficos para visualizar la distribución de las variables cualitativas.

2.4.2.1 Diagrama de barras a color

Escuelas %>% ggplot(aes(Pais)) +
  geom_bar(color="black", fill=rainbow(length(levels(Escuelas$Pais)))) +
  ggtitle("Diagrama de barras de país") +
  labs(x="país", y="Frec. Absoluta") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 30, size = 8))

2.4.2.2 Diagrama de torta más elaborado

Escuelas2 <- Escuelas %>% count(Pais) # Cuenta las frecuencias de país
Escuelas2$n <- Escuelas2$n * 100 / sum(Escuelas2$n) # Saca el porcentaje de cada parte

Escuelas3 <- Escuelas2 %>% 
  mutate(csum = rev(cumsum(rev(n))), 
         pos = n/2 + lead(csum, 1),
         pos = if_else(is.na(pos), n/2, pos))

ggplot(Escuelas2, aes(x = "" , y = n, fill = fct_inorder(Pais))) +
  geom_col(width = 1, color = 1) +
  coord_polar(theta = "y") +
  scale_fill_brewer(palette = "Pastel1") +
  geom_label_repel(data = Escuelas3,
                   aes(y = pos, label = paste0(round(n, 1), "%")),
                   size = 4.5, nudge_x = 1, show.legend = FALSE) +
  guides(fill = guide_legend(title = "País")) +
  theme_void()
Warning in RColorBrewer::brewer.pal(n, pal): n too large, allowed maximum for palette Pastel1 is 9
Returning the palette you asked for with that many colors

2.4.2.3 Diagrama de Pareto

pareto.chart(table(Escuelas$Pais), main="Diagrama de Pareto de País")

               
Pareto chart analysis for table(Escuelas$Pais)
                Frequency Cum.Freq. Percentage Cum.Percent.
  Australia             9         9         36           36
  India                 4        13         16           52
  China                 2        15          8           60
  Malasia               2        17          8           68
  Singapur              2        19          8           76
  Tailandia             2        21          8           84
  Filipinas             1        22          4           88
  Japon                 1        23          4           92
  Nueva Zelanda         1        24          4           96
  Pakistán              1        25          4          100

2.5 2. Análisis de Variables Cuantitativas

2.5.1 2.1 Tablas de Frecuencia

Para variables continuas, es necesario agrupar los datos en intervalos para crear tablas de frecuencia.

library(fdth)

Attaching package: 'fdth'
The following objects are masked from 'package:stats':

    sd, var
# Si toma muchos valores, es mejor hacer una tabla de datos agrupados
# Se utiliza la regla de Sturges para definir los intervalos.
Tabla_frec <- fdt(Escuelas$Costo_local, breaks = "Sturges")
Tabla_frec
      Class limits f   rf rf(%) cf cf(%)
      [990,6390.1) 7 0.28    28  7    28
  [6390.1,11790.2) 6 0.24    24 13    52
 [11790.2,17190.3) 6 0.24    24 19    76
 [17190.3,22590.4) 4 0.16    16 23    92
 [22590.4,27990.5) 1 0.04     4 24    96
 [27990.5,33390.6) 1 0.04     4 25   100

2.5.2 2.2 Gráficos

2.5.2.1 Histogramas

El histograma es la herramienta gráfica principal para visualizar la distribución de una variable cuantitativa.

Escuelas %>% ggplot(aes(x = Costo_local)) +
  geom_histogram(fill = "gray", color = "black", bins = 1 + floor(log2(length(Escuelas$Costo_local)))) + # Regla de Sturges
  ggtitle("Histograma de costo local") +
  labs(x = "Costo (US$)", y = "Frecuencia") +
  theme_minimal()

2.5.2.2 Boxplot

El diagrama de caja o boxplot resume la distribución a través de sus cuartiles e identifica valores atípicos.

boxplot(Escuelas$Insc_t_completo, horizontal = TRUE, main = "Diagrama de caja de los alumnos por profesor", xlab = "Alumnos/profesor")

2.5.3 2.3 Estadísticas de los datos

Se calculan diversas medidas de resumen para describir las variables cuantitativas.

# Medidas de tendencia central y dispersión
mean(Escuelas$Insc_t_completo) 
[1] 165.16
median(Escuelas$Insc_t_completo)
[1] 126
sd(Escuelas$Insc_t_completo)
[1] 140.8411
max(Escuelas$Insc_t_completo)
[1] 463
min(Escuelas$Insc_t_completo)
[1] 12
# Medidas de posición (Cuantiles)
# Cuartiles
quantile(x = Escuelas$Insc_t_completo, probs = seq(0, 1, by = 1/4))
  0%  25%  50%  75% 100% 
  12   44  126  240  463 
# Deciles
quantile(Escuelas$Insc_t_completo, probs = seq(0, 1, 1/10))
   0%   10%   20%   30%   40%   50%   60%   70%   80%   90%  100% 
 12.0  30.0  39.6  52.0  82.0 126.0 168.2 222.4 310.0 385.4 463.0 
# Percentiles
quantile(Escuelas$Insc_t_completo, probs = 0.95)
  95% 
391.4 
# Resumen estadístico completo
summary(Escuelas)
                            Escuela        Cod            Pais  
 Asian Institute of Management  : 2   2345   : 1   Australia:9  
 Australian National University : 1   2347   : 1   India    :4  
 Chinese University of Hong Kong: 1   2349   : 1   China    :2  
 Chulalongkorn University       : 1   2351   : 1   Malasia  :2  
 Curlin Institute of Technology : 1   2353   : 1   Singapur :2  
 De La Salle University         : 1   2355   : 1   Tailandia:2  
 (Other)                        :18   (Other):19   (Other)  :4  
 Insc_t_completo Alumnos_facultad  Costo_local    Costo_extranjero
 Min.   : 12.0   Min.   : 2.00    Min.   : 1000   Min.   : 1000   
 1st Qu.: 44.0   1st Qu.: 5.00    1st Qu.: 6146   1st Qu.: 9000   
 Median :126.0   Median : 7.00    Median :11513   Median :17765   
 Mean   :165.2   Mean   : 8.48    Mean   :12375   Mean   :16582   
 3rd Qu.:240.0   3rd Qu.:13.00    3rd Qu.:17172   3rd Qu.:22500   
 Max.   :463.0   Max.   :19.00    Max.   :33060   Max.   :33060   
                                                                  
      Edad        Porc_extranj   GMAT    Ex_Ingles Experiencia Sueldo_inicial 
 Min.   :22.00   Min.   : 0.00   No:11   No:17     No: 6       Min.   : 7000  
 1st Qu.:25.00   1st Qu.: 6.00   Si:14   Si: 8     Si:19       1st Qu.:16000  
 Median :29.00   Median :27.00                                 Median :41400  
 Mean   :28.36   Mean   :28.08                                 Mean   :37292  
 3rd Qu.:30.00   3rd Qu.:43.00                                 3rd Qu.:52500  
 Max.   :37.00   Max.   :90.00                                 Max.   :87000  
                                                                              
basicStats(Escuelas$Insc_t_completo)
            X..Escuelas.Insc_t_completo
nobs                          25.000000
NAs                            0.000000
Minimum                       12.000000
Maximum                      463.000000
1. Quartile                   44.000000
3. Quartile                  240.000000
Mean                         165.160000
Median                       126.000000
Sum                         4129.000000
SE Mean                       28.168226
LCL Mean                     107.023640
UCL Mean                     223.296360
Variance                   19836.223333
Stdev                        140.841128
Skewness                       0.668241
Kurtosis                      -1.009321

2.6 3. Análisis de Pares de Variables

2.6.1 3.1 Dos Variables Cualitativas

2.6.1.1 Tablas de Contingencia

Se utilizan para explorar la relación entre dos variables categóricas, mostrando frecuencias conjuntas y perfiles.

Table <- xtabs(~Ex_Ingles + GMAT, data = Escuelas)
addmargins(Table) #Frec. Absolutas
         GMAT
Ex_Ingles No Si Sum
      No   7 10  17
      Si   4  4   8
      Sum 11 14  25
# totPercents(Table) #Frec. Relativas
rowPercents(Table) #Perfiles fila
         GMAT
Ex_Ingles   No   Si Total Count
       No 41.2 58.8   100    17
       Si 50.0 50.0   100     8
colPercents(Table) #Perfiles columna
         GMAT
Ex_Ingles    No    Si
    No     63.6  71.4
    Si     36.4  28.6
    Total 100.0 100.0
    Count  11.0  14.0
# Gráfico de barras apiladas para perfiles
ggplot(Escuelas, aes(x = Pais, fill = GMAT)) +
  geom_bar(position = "fill") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 30, size = 8))

2.6.2 3.2 Una Cualitativa y otra Cuantitativa

2.6.2.1 Boxplots por categorías

Permiten comparar la distribución de una variable cuantitativa a través de las categorías de una variable cualitativa.

Escuelas %>% ggplot(aes(x = Pais, y = Costo_local)) +
  geom_boxplot() +
  ggtitle("Boxplot de costo local segmentado por país") +
  labs(x = "país", y = "Costo local") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 30, size = 8))

2.6.2.2 Histogramas por categorías

Permiten visualizar la forma de la distribución de la variable cuantitativa para cada categoría.

Escuelas %>% ggplot(aes(x = Costo_extranjero)) +
  geom_histogram(fill = "gray", color = "black", bins = 4) +
  ggtitle("Histograma de costo extranjero") +
  labs(x = "Costo US$", y = "Frecuencia") +
  facet_wrap(~Experiencia) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

2.6.3 3.3 Dos variables cuantitativas

2.6.3.1 Coeficiente de correlación

Mide la fuerza y dirección de la relación lineal entre dos variables cuantitativas.

cor(Escuelas$Costo_local, Escuelas$Costo_extranjero)
[1] 0.8347421

2.6.3.2 Diagrama de dispersión

Visualiza la relación entre dos variables cuantitativas. Se pueden añadir otras variables a través del color o el tamaño.

ggplot(Escuelas, aes(x = Costo_local, y = Costo_extranjero, col = GMAT, size = Alumnos_facultad)) +
  geom_point() +
  labs(title = "Relación costo local vs extranjero", x = "Costo local", y = "Costo extranjero") + theme_gray()

2.7 4. Opcional: Gráficos Multivariados

2.7.1 Diagrama de estrellas o de radar

Visualiza múltiples variables cuantitativas para cada observación.

subset <- as.data.frame(cbind(Escuelas$Insc_t_completo, Escuelas$Edad, Escuelas$Costo_local, Escuelas$Alumnos_facultad))
colnames(subset) <- c("Insc", "Edad", "cost_l", "al_pr")
rownames(subset) <- as.factor(Escuelas$Cod)

stars(subset[1:10, ], key.loc = c(10, 5), draw.segments = TRUE)

2.7.2 Caras de Chernoff

Mapea variables multivariadas a características de un rostro humano.

a <- faces(subset[1:10, ], face.type = 1)

effect of variables:
 modified item       Var     
 "height of face   " "Insc"  
 "width of face    " "Edad"  
 "structure of face" "cost_l"
 "height of mouth  " "al_pr" 
 "width of mouth   " "Insc"  
 "smiling          " "Edad"  
 "height of eyes   " "cost_l"
 "width of eyes    " "al_pr" 
 "height of hair   " "Insc"  
 "width of hair   "  "Edad"  
 "style of hair   "  "cost_l"
 "height of nose  "  "al_pr" 
 "width of nose   "  "Insc"  
 "width of ear    "  "Edad"  
 "height of ear   "  "cost_l"
plot.faces(a)